/**
 * 
 */
package com.I9lou.se.lurker.remote.support;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericField;

import com.I9lou.se.lurker.remote.IndexableDocument;
import com.I9lou.se.lurker.remote.IndexableField;

/**
 * 可将IndexableDocument转换为Lucene的Document对象转换器
 * @author chenwei
 * @date 2011-03-30
 */
public final class DocumentConverter {
	
	public static Document convert(IndexableDocument indexableDocument) {
		Document document = new Document();
		for(IndexableField indexableField : indexableDocument.getFields()) {
			if( !indexableField.isNumeric() ) {
				Field field = new Field( indexableField.getName(),
						 				 indexableField.getStringValue(),
						 				 indexableField.getStore(),
						 				 indexableField.getIndex()
	  									);
				field.setBoost( indexableField.getBoost() );
				document.add( field );
			} else {
				NumericField field = null;
				if( indexableField.isSortOnly() )
					field = new NumericField( indexableField.getName(), Integer.MAX_VALUE, 
											  indexableField.getStore(), true );
				else
					field = new NumericField(indexableField.getName(), indexableField.getStore(), true);
				if( indexableField.isLong() )
					field.setLongValue( indexableField.getLongValue() );
				else if( indexableField.isDouble() )
					field.setDoubleValue( indexableField.getDoubleValue() );
				else if( indexableField.isInt() )
					field.setIntValue( indexableField.getIntValue() );
				else if( indexableField.isFloat() )
					field.setFloatValue( indexableField.getFloatValue() );
				else
					throw new IllegalArgumentException("Unexcepted numeric type for field: " + indexableField.getName());
				field.setBoost( indexableField.getBoost() );
				document.add(field);
			}
		}
		
		document.setBoost(indexableDocument.getBoost());
		return document;
	}
	
}
